/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package documentadorrepositorio.exportacaoAdapterTexto;

import documentadorrepositorio.builderDocumentacao.CustomXWPFDocument;
import documentadorrepositorio.builderDocumentacao.DocumentacaoBuilder;
import documentadorrepositorio.builderDocumentacao.DocumentacaoModoWord;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import jxl.Sheet;
import org.apache.poi.xwpf.usermodel.BreakType;
import org.apache.poi.xwpf.usermodel.Document;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.VerticalAlign;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;

/**
 *
 * @author DEP
 */
public class ExportacaoTextoWord implements IExportacaoTexto {

    CustomXWPFDocument documento = null;
    XWPFParagraph paragrafoAtual = null;
    XWPFRun runParagrafoAtual = null;
    FileOutputStream outputStream = null;
    FonteTexto fonteAtual = null;
    AlinhamentoTexto alinhamentoAtual = AlinhamentoTexto.Esqueda;
    private String nomeArquivo = "";

    public void criaArquivo() throws Exception {
        if (this.nomeArquivo.isEmpty()) {
            throw new Exception("Nome de aquivo não informado.");
        }
        outputStream = new FileOutputStream(nomeArquivo);
        documento = new CustomXWPFDocument();
    }

    public void setNomeArquivo(String nomeArquivo) {
        this.nomeArquivo = nomeArquivo;
    }

    public String getNomeArquivo() {
        return nomeArquivo;
    }

    public void novaPagina() {
        if (runParagrafoAtual != null) {
            runParagrafoAtual.addBreak(BreakType.PAGE);
        }

    }

    public void iniciaParagrafo() {
        if (documento != null) {
            paragrafoAtual = documento.createParagraph();
            setAlinhamento(alinhamentoAtual);
        }
    }

    private List<String> quebraLinhas(String texto) {
        String tmp = "";
        List<String> result = new ArrayList<String>();
        for (int i = 0; i < texto.length(); i++) {
            if (texto.charAt(i) == '\n') {
                result.add(tmp);
                tmp = "";
            } else {
                tmp += texto.charAt(i);
            }
        }

        if (!tmp.isEmpty()) {
            result.add(tmp);
        }
        return result;
    }

    public void insereTexto(String text) {
        
        if (paragrafoAtual != null) {
            List<String> Linhas = new ArrayList<String>();;
            if (text.contains("\n")) {
                Linhas = quebraLinhas(text);
            } else {
                Linhas.add(text);
            }

            for (String item : Linhas) {
                //if(item.startsWith("\n"))
                //if(runParagrafoAtual!= null)
                //Cria uma nova linha
                //runParagrafoAtual.addBreak();

                //Inicia um novo bloco de texto
                runParagrafoAtual = createRun();

                runParagrafoAtual.setText(item);

                //if(item.endsWith("\n"))
                //{
                //Cria uma nova linha
                runParagrafoAtual.addBreak();
                //Inicia um novo bloco de texto
                //  runParagrafoAtual = createRun();
                //}
            }
        }
    }

    public void insereImagem(byte[] dadosImagem) {
        try {
            String blipId = documento.addPictureData(
                    dadosImagem, Document.PICTURE_TYPE_PNG);
            //System.out.println(documento.getNextPicNameNumber(Document.PICTURE_TYPE_PNG));
            documento.createPicture(blipId, documento.getNextPicNameNumber(Document.PICTURE_TYPE_PNG), 310, 310);
            documento.createParagraph().createRun().addBreak();
            
        } catch (Exception e) {
        }
    }
    
    public void insereTabela(Sheet planilha){
        try
        {
            iniciaParagrafo();
            int qtdeLinhas = planilha.getRows();
            int qtdeColunas = planilha.getColumns();
            XWPFTable tabela = documento.createTable(qtdeLinhas, qtdeColunas);
            for (int i = 0; i < qtdeLinhas; i++)
            {
                //XWPFTableRow row = tabela.createRow();
                //tabela.createRow();
                for (int j = 0; j < qtdeColunas; j++)
                {
                   tabela.getRow(i).getCell(j).setText(planilha.getCell(j, i).getContents());
                    //tabela.getRow(i).getCell(j).setText();
                }
            }
        }
        catch(Exception ex)
        {
            String s = ex.getMessage();
        }
        /*
        XWPFTable tbl1 = documento.createTable();
        XWPFTableRow tblCol1 =  tbl1.getRow(0);
        tblCol1.getCell(0).setText("col 1, linha 1");
        tblCol1.addNewTableCell().setText("col 2, linha 1");
        tblCol1.addNewTableCell().setText("col 3, linha 1");
        

        XWPFTableRow tblCol2 =  tbl1.getRow(0);
        tblCol2.getCell(0).setText("col 1, linha 2");
        tblCol2.addNewTableCell().setText("col 2, linha 2");
        tblCol2.addNewTableCell().setText("col 3, linha 2");
        
        XWPFTableRow tblCol3 =  tbl1.getRow(0);
        tblCol3.getCell(0).setText("col 1, linha 3");
        tblCol3.addNewTableCell().setText("col 2, linha 3");
        tblCol3.addNewTableCell().setText("col 3, linha 3");
        */
        documento.createParagraph().createRun().addBreak();
    }

    public void setFonteTexto(FonteTexto fonte) {
        this.fonteAtual = fonte;
        runParagrafoAtual = createRun();
    }

    public void escreveArquivo() throws Exception {
        documento.write(outputStream);
        outputStream.flush();
    }

    public void flush() throws Exception 
    {
        outputStream.flush();
    }
    
    public void fechaArquivo() throws Exception {
        outputStream.close();
    }

    public void setAlinhamento(AlinhamentoTexto alinhamento) {
        this.alinhamentoAtual = alinhamento;
        if (paragrafoAtual != null) {
            if (alinhamentoAtual == AlinhamentoTexto.Centro) {
                paragrafoAtual.setAlignment(ParagraphAlignment.CENTER);
            } else if (alinhamentoAtual == AlinhamentoTexto.Direita) {
                paragrafoAtual.setAlignment(ParagraphAlignment.RIGHT);
            } else if (alinhamentoAtual == AlinhamentoTexto.Esqueda) {
                paragrafoAtual.setAlignment(ParagraphAlignment.LEFT);
            } else if (alinhamentoAtual == AlinhamentoTexto.Justificado) {
                paragrafoAtual.setAlignment(ParagraphAlignment.DISTRIBUTE);
            }
        }
    }

    private XWPFRun createRun() {
        if (paragrafoAtual != null) {
            XWPFRun run = paragrafoAtual.createRun();
            if (fonteAtual != null) {
                run.setBold(fonteAtual.getNegrito());
                run.setFontFamily(fonteAtual.getNome());
                run.setFontSize((int) fonteAtual.getTamanho());
                run.setItalic(fonteAtual.getItalico());
                if (fonteAtual.getSublinhado()) {
                    run.setSubscript(VerticalAlign.BASELINE);
                }

            }
            return run;
        }
        return null;
    }

    public DocumentacaoBuilder getBuilderInstance() {
        return new DocumentacaoModoWord();
    }
}
